# 1. 写出异常的完整语法。
# 2. 如何抛出自定义异常？
# 3. 课堂上的代码重写一遍。



# # 1. 写出异常的完整语法。
# try:
#     #可能有异常的代码
# except   #异常类型   可以给一个别名as
#     # 捕获异常执行的代码
# else:
#     #可以加else
#
## 2. 如何抛出自定义异常？
# raise 可以抛出异常



# 3. 课堂上的代码重写一遍。
# 私有属性
# class Person:
#     def __init__(self,name):
#         self.name=name
#         self.__age=0
#
#     def eat(self):
#         print(f'{self.name}正在吃饭')
#         print(f'{self.__age}很帅' )
#
#     def drink(self):
#         print('我最帅')
#
#
# xiaoming = Person('小明')
# # xiaoming.age#会报错   内部定义的只能内部使用
# xiaoming.eat()  #内部可以访问


# 私有属性的应用
# 想从外部访问 可以定义一个从外部访问的方法
class Person:
    def __init__(self,name,):
        self.name=name
        self.__age=0

    def set_age(self,name,age):
        if age <1 and age > 100:
            print('年龄合法')
        else:
            self.__age=age

    def get_age(self):
        return self.__age

A =Person('张三')
A.set_age('张三',-10)



try:
    print(name)
except NameError:
    print('姓名没有定义')
    print(111111111111)



try:
    num1 =int(input('请输入一个数字:'))
    result =1/num1
    print((num1))
except ZeroDivisionError:  #方式二 将两个异常分开捕获 ,有不同的处理方式
    print('除数不能为零')
except ValueError:
    print('输入不能为非数字')


# try:
#     num1 = int(input('请输入一个数字:'))
#     result = 1 / num1
#     print((num1))
# except Exception as a: as是别名
#     print(a)     #方式一  更加推荐
#
#
try:
    num = int(input('请输入一个数字:'))
    result = 1/num
    print(num)
except (ZeroDivisionError,ValueError)as a:
    print('输入的数字不合法')
    print(a)
else:
    print('输入的数字合法')  #else程序运行没有异常时执行的部分(没有异常)


try:
    f = open('demo.txt','r',encoding='utf8')  #读取文件的时候可能报错
except Exception as e:              #如果有异常就要重新打开这个文件
    f =open('demo.txt','w',encoding='utf8')
    print(e)
else:
    content=f.read()  #文件可以正常读取的操作
    print(content)
finally:
    f.close()


def fn1():
    res=1/0
    print('第一层')

def fn2():
    try:
        fn1()
        print('第二层')
    except Exception as e:
        print(e)

def fn3():
    fn2()
    print('第三层')

fn3()



try:
    try:
        num = int(input('请输入一个数字:'))
        res = 1 / num
    except ValueError as e:
        print(e)
except ZeroDivisionError as e:
    print(e)


class LenError(Exception):
    def __str__(self):
        return '输入的长度不符合规定'

class InfoError(Exception):
    def __str__(self):
        return'输入内容不符合规定'


username =input('请输入用户名:')
try:
    if len(username)>=8 and len(username)<=16:
        print('长度符合规定')
    else:
        raise LenError
except LenError as e:
    print(e)


